/**
  * @File    :   i2c.h
  * @Time    :   2020/04/05 15:47:01
  * @Author  :   huenrong
  */

#ifndef __I2C_H
#define __I2C_H

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <string.h>

/**
  * @name   i2c_write_data
  * @brief  向无寄存器地址的i2c从设备发送数据/命令
  * @param  fd: i2c从设备文件描述符
  * @param  slave_addr: 需要发送的数据/命令
  * @param  slave_addr: 需要发送的数据/命令长度
  * @retval 成功: 0
  *         失败: -1
  */
int i2c_write_data(const int fd, const uint8_t *send_data, const uint8_t send_data_len);

/**
  * @name   i2c_read_data
  * @brief  从无寄存器地址的i2c从设备读取数据
  * @param  fd: i2c从设备文件描述符
  * @param  recv_data_len: 指定读取长度
  * @param  recv_data: 读取到的数据
  * @retval 成功: 0
  *         失败: -1
  */
int i2c_read_data(const int fd, const uint8_t recv_data_len, uint8_t *recv_data);

/**
  * @name   i2c_write_data_sub
  * @brief  向有寄存器的i2c从设备发送数据/命令(即写i2c从设备寄存器)
  * @param  fd: i2c从设备文件描述符
  * @param  slave_addr: i2c从设备地址
  * @param  reg_addr: i2c从设备寄存器地址
  * @param  write_data: 需要发送的数据/命令
  * @param  write_data_len: 需要发送的数据/命令长度
  * @retval 成功: 实际发送长度
  *         失败: -1
  */
int i2c_write_data_sub(const int fd, const uint8_t slave_addr, const uint8_t reg_addr,
                       const uint8_t *write_data, const uint16_t write_data_len);

/**
  * @name   i2c_read_data_sub
  * @brief  从有寄存器地址的i2c从设备读取数据(即读i2c从设备寄存器)
  * @param  read_data: 读取到的数据
  * @param  fd: i2c从设备文件描述符
  * @param  slave_addr: i2c从设备地址
  * @param  reg_addr: i2c从设备寄存器地址
  * @param  read_data_len: 指定读取长度
  * @retval 成功: 实际读取长度
  *         失败: -1
  */
int i2c_read_data_sub(uint8_t *read_data, const int fd, const uint8_t slave_addr,
                      const uint8_t reg_addr, const uint16_t read_data_len);

#endif
